package com.wimcorp.magic.userinterface;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Set;

import com.wimcorp.magic.exception.ManaException;
import com.wimcorp.magic.exception.SystemException;

public interface GameInterface extends Remote {

	void register(String name, UserInterface playerInterface) throws RemoteException, SystemException;

	void setSelectedDeck(String playerName, int deckId) throws RemoteException,SystemException;

	void ready(String playerName) throws RemoteException;

	List<String> viewAvailableDecks() throws RemoteException;

	List<String> viewHand(String playerName) throws RemoteException;

	int mulligan(String playerName) throws RemoteException;

	List<String> viewBattlefield(String playerName) throws RemoteException;

	List<String> viewBattlefield() throws RemoteException;

	List<String> viewDeck(String playerName) throws RemoteException;

	List<String> viewGraveyard(String playerName) throws RemoteException;
	
	List<String> viewExile(String playerName) throws RemoteException;

	List<String> getPlayers() throws RemoteException;

	boolean playerExists(String name) throws RemoteException;

	int viewLife(String playerName) throws RemoteException;

	String getOpponent(String playerName) throws RemoteException;

	long validateInput(String playerName, Set<String> typeSet, Set<String> locations, Set<String> behaviors,
			long identifier) throws RemoteException;

	void tap(String playerName, long identifier)throws RemoteException,ManaException;
	
	void untap(String playerName, long identifier) throws RemoteException,ManaException;;

	String getOpponentCardName(String playerName,long attackerId) throws RemoteException;

	void discardCard(String playerName, long cardId) throws RemoteException;

	List<String> viewAttackers() throws RemoteException;

	String viewCard(String playerName, Long id) throws RemoteException;

	void testHand(String playerName) throws RemoteException;

	boolean isBlockable(String playerName, long attackerId) throws RemoteException;

	long validateAbilityInput(String playerName, long identifier) throws RemoteException;

	void activateAbility(String playerName)throws RemoteException;

	boolean canBlock(String playerName,long defenderId, long attackerId)throws RemoteException;

	String getCardName(String playerName, long result) throws RemoteException;

	

}
